package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import modelo.Conexion;
import modelo.Inspeccion;
import modelo.Poliza;
import controlador.CVDetallePoliza;
import vista.VPoliza;

public class CVPoliza implements ActionListener {
	private VPoliza vPoliza;
	private CVDetallePoliza cVDetallePoliza;
	
	public CVPoliza() {
		super();
		this.vPoliza = new VPoliza(this.generarCodigo());
		this.vPoliza.addListener(this);
		this.vPoliza.setVisible(true);
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equalsIgnoreCase("Registrar Detalle Poliza")){
			if(verificarTodo()=="Correcto")
				cVDetallePoliza=new CVDetallePoliza(vPoliza.getCodPoliza());
			else vPoliza.mostrarMensaje(verificarTodo());
				
		}
		else if (e.getActionCommand().equalsIgnoreCase("Guardar")){
			if(verificarTodo()=="Correcto"){
				if(!buscarPoliza(vPoliza.getCodPoliza())){
					try {					
					Poliza laPoliza = new Poliza(vPoliza.getCodPoliza(), Float.parseFloat(vPoliza.getStrMonto()), 'A', vPoliza.getPlaca(), vPoliza.getTipo());
					registrarPoliza(laPoliza);
					vPoliza.mostrarMensaje("Se guardó correctamente la poliza");
					vPoliza.limpiar();
					vPoliza.setCodigo(generarCodigo());
					} catch (SQLException e1){
						e1.printStackTrace();}
				}else {	vPoliza.mostrarMensaje("El codigo ingresado ya existe");
						vPoliza.limpiar();
						vPoliza.setCodigo(generarCodigo());
				}
			} else vPoliza.mostrarMensaje(verificarTodo());
			
		}else if (e.getActionCommand().equalsIgnoreCase("Modificar")){
			if(verificarTodo()=="Correcto"){
				modificarPoliza(vPoliza.getCodPoliza(), vPoliza.getStrMonto(), vPoliza.getPlaca(), vPoliza.getTipo());
			}
			else vPoliza.mostrarMensaje(verificarTodo());
			
		}
		else if (e.getActionCommand().equalsIgnoreCase("Cancelar")){
			vPoliza.limpiar();
			vPoliza.setCodigo(generarCodigo());
		}
		else if (e.getActionCommand().equalsIgnoreCase("Buscar")){
			mostrarPoliza(vPoliza.getCodPoliza());
		}
		else if (e.getActionCommand().equalsIgnoreCase("Salir")){
			vPoliza.dispose();
		}
		else if (e.getActionCommand().equalsIgnoreCase("Eliminar")){
			eliminarPoliza(vPoliza.getCodPoliza());
			vPoliza.mostrarMensaje("Se ha eliminado la poliza");
			vPoliza.limpiar();
			vPoliza.setCodigo(generarCodigo());
		}
		
	}
	
	public String verificarTodo(){
		if(!vPoliza.camposVacios()){
			if(vPoliza.getCodPoliza().length()<=10){		
				if(vPoliza.getPlaca().length()<=7 && vPoliza.getPlaca().length()>=6){
					if(verificarMonto(vPoliza.getStrMonto())){
						if(buscarAuto(vPoliza.getPlaca())){
							return "Correcto";
						}else return "La placa ingresada no se encuentra registrada";
					}else return "El monto no tiene el formato correcto (##.##)";
				}else return "La placa del auto debe tener de 6 a 7 digitos";
			} else return "El codigo no puede tener mas de 10 digitos";
		} else return "Debe llenar todos los campos";
	}
	
	public boolean buscarPoliza(String codigo){
		boolean seEncontro = false;
		String tiraSQL = "SELECT * FROM poliza";
		ResultSet resultSet = Conexion.consultar(tiraSQL);		
		try {
			while (resultSet.next()) {
				String pol_cod = resultSet.getString("pol_cod");
				if (pol_cod.equals(codigo)){
					seEncontro=true;
					break;
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();}
		return seEncontro;
	}
	
	public void mostrarPoliza(String codigo){
		boolean seEncontro = false;
		String tiraSQL = "SELECT * FROM poliza";
		ResultSet resultSet = Conexion.consultar(tiraSQL);		
		try {
			while (resultSet.next()) {
				String pol_cod = resultSet.getString("pol_cod");
				if (pol_cod.equals(codigo)){
					seEncontro=true;
					String pol_mt = resultSet.getString("pol_mt");
					String pol_pa = resultSet.getString("pol_pa");
					String pol_status = resultSet.getString("pol_status");
					String pol_tipo = resultSet.getString("pol_tipo");
					if(pol_status.trim().equalsIgnoreCase("A")){
						vPoliza.setPoliza(pol_cod, pol_mt, pol_pa, pol_tipo);
						vPoliza.bloquearBuscar();
					}else {
						vPoliza.mostrarMensaje("La poliza fue eliminada");
						vPoliza.limpiar();
						vPoliza.setCodigo(generarCodigo());
					}
				}
				
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		if(!seEncontro) vPoliza.mostrarMensaje("No se encontró la poliza");
	}
	
	public void modificarPoliza(String codigo, String monto, String placa , String tipo){
		String tiraSQL = "UPDATE poliza "+
				 "SET pol_mt="+monto + ","+
				 " pol_pa='"+placa + "'"+
				 " pol_tipo='"+tipo + "'"+
				 " WHERE pol_cod ='"+codigo+"'";
		Conexion.ejecutar(tiraSQL);
		vPoliza.mostrarMensaje("Se ha modificado correctamente la poliza");
	}
	
	public void eliminarPoliza(String codigo){
		String tiraSQL = "UPDATE poliza "+
				 "SET pol_status='E'"+
				 " WHERE pol_cod ='"+codigo+"'";
		Conexion.ejecutar(tiraSQL);
	}
	
	public void registrarPoliza(Poliza poliza) throws SQLException {
		String tiraSQL = "INSERT INTO poliza "+
		 				 "(pol_cod, pol_mt, pol_pa, pol_status, pol_tipo) "+
		 				 "VALUES ("+
		 				 "'"+poliza.getPol_cod()+"',"+
		 				 "'"+poliza.getPol_mt()+"',"+
		 				 "'"+poliza.getPol_pla()+"',"+
		 				 "'"+poliza.getPol_status()+"',"+
		 				 "'"+poliza.getPol_tipo()+"')";
		Conexion.ejecutar(tiraSQL);
	}
	
	public boolean verificarMonto(String strMonto){
		int puntos=0;
		char caracter=' ';
		for (int i = 0; i < strMonto.length(); i++) {
			caracter=strMonto.charAt(i);
			if((int)caracter == 46 && puntos==0){
				puntos++;
			} else if((int)caracter < 48 || (int)caracter > 57){
				return false;
			}
		}
		return true;
	}
	
	public boolean buscarAuto(String placa){
		String tiraSQL = "SELECT * FROM auto";
		ResultSet resultSet = Conexion.consultar(tiraSQL);		
		try {
			while (resultSet.next()) {
				if(placa.equals(resultSet.getString("aut_pla")))
					return true;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		  }
		return false;
	}
	
	public String generarCodigo() {
		String codigo="RPV0000";
		
		String tiraSQL = "SELECT * FROM poliza";
		ResultSet resultSet = Conexion.consultar(tiraSQL);		
		try {
			while (resultSet.next()) {
				if(Integer.parseInt(codigo.substring(3))<Integer.parseInt(resultSet.getString("pol_cod").substring(3)))
					codigo = resultSet.getString("pol_cod");
				
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		int endIndex=3;
		for (int i=endIndex; i < codigo.length(); i++) {
			if(codigo.charAt(i)!='0'){
				endIndex=i;
				break;
			}
		}
		
		String ultimo= codigo.substring(3);
		int numero =Integer.parseInt(ultimo);
		numero=numero+1;
		ultimo= String.valueOf(numero);
			if(numero==10) endIndex--;
			if(numero==100) endIndex--;
			if(numero==1000) endIndex--;
		String primero= codigo.substring(0, endIndex);
		return primero+ultimo;
	}
}
